#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include "uart.h"
#include <stdlib.h>  // 用于 atoi

int fputc(int c, FILE *stream)
{
    DL_UART_Main_transmitDataBlocking(UART_0_INST,c);
    return c;
}
int fputs(const char* restrict s, FILE *restrict stream)
{
    uint16_t i,len;
    len = strlen(s);
    for(i = 0;i < len;i++)
    {
        DL_UART_Main_transmitDataBlocking(UART_0_INST,s[i]); //修改UART即可使用不同的串口
    }
    return len;
}
int puts(const char *_ptr)
{
    int count = fputs(_ptr,stdout);
    count += fputs("\n",stdout);
    return count;
}

void UART_SendByte(uint8_t data) {
    // 等待发送缓冲区就绪（确保上一个数据已发送完成）
    while (!DL_UART_isTXFIFOEmpty(UART_0_INST));
    
    // 发送单字节数据（0xFF）
    DL_UART_transmitData(UART_0_INST, data);
}

void UART_ReceiveByte()
{
     while (!DL_UART_isRXFIFOEmpty(UART_0_INST));
    
    // 单字节数据（0xFF）
    DL_UART_receiveData(UART_0_INST);
}

#define RX_BUFFER_SIZE 1  // 接收1字节（uint8_t）
volatile uint8_t gUART_RxBuffer[RX_BUFFER_SIZE];  // DMA接收缓冲区
volatile bool gUART_RxComplete = false;           // 接收完成标志

// // DMA传输完成回调函数
// void DMA_UART_R0_Callback(DMA_Type *dma, uint32_t ch, uint32_t status, void *userArg) {
//     if (status == DL_DMA_INTERRUPT_TC) {  // 传输完成中断
//         gUART_RxComplete = true;          // 设置标志位
//     }
// }

// void UART_InitWithDMA(void) {
//     // 1. 初始化UART（已由SYSCFG_DL_UART_0_init()完成）
   
//     // 2. 配置DMA接收
//     DL_DMA_registerInterrupt(DMA, DMA_CH1_CHAN_ID, DMA_UART_Rx_Callback, NULL);
//     DL_DMA_enableChannel(DMA, DMA_CH1_CHAN_ID);
//     DL_DMA_enableInterrupt(DMA, DMA_CH1_CHAN_ID, DL_DMA_INTERRUPT_TC);  // 启用传输完成中断

//     // 3. 绑定UART RX到DMA
//     DL_UART_Main_enableDMAReceiveEvent(UART_0_INST, DL_UART_DMA_INTERRUPT_RX);
//     DL_DMA_setSrcAddress(DMA, DMA_CH1_CHAN_ID, (uint32_t)&(UART_0_INST->RXDATA));  // 数据源：UART RX寄存器
//     DL_DMA_setDestAddress(DMA, DMA_CH1_CHAN_ID, (uint32_t)gUART_RxBuffer);         // 目标：接收缓冲区
//     DL_DMA_setTransferSize(DMA, DMA_CH1_CHAN_ID, RX_BUFFER_SIZE);                  // 传输1字节

//     // 4. 启动DMA接收
//     DL_DMA_startChannel(DMA, DMA_CH1_CHAN_ID);
// }